package Controller;

import java.util.ArrayList;
import java.util.List;

import Beans.ReservaBean;
import DAO.HibernateDepositoDAO;
import DAO.HibernateReservaDAO;
import DAO.HibernateSectorDAO;
import DTO.ReservaDTO;
import DTO.SalonDTO;
import DTO.SucursalDTO;
import JavaUtils.DateUtil;
import Model.*;

public class AdministradorReserva {
	
	private static AdministradorReserva instancia;
	private AdministradorReserva(){
		
	}
	
	public static AdministradorReserva getInstancia(){
		if(instancia==null)
			instancia=new AdministradorReserva();
		return instancia;
	}
	
	public void grabarReserva(ReservaDTO r, SalonDTO s){
		HibernateReservaDAO.getInstancia().grabarReserva(r, s);
	}

	public ReservaDTO reservar(ReservaDTO reserva, SucursalDTO sucursal) throws Exception {
		Sucursal sucursalModel=AdministradorSucursal.getInstancia().fromDTOTOModel(sucursal);
		sucursalModel=AdministradorSucursal.getInstancia().buscarSucursal(sucursalModel);
		SalonDTO salon=AdministradorSalon.getInstancia().fromModelTODTO(sucursalModel.getSalon());
		List<Reserva>reservasDelDia=HibernateReservaDAO.getInstancia().getReservasDelDia(reserva, salon);
		List<Mesa>mesas=this.getMesasMenosReservas(reservasDelDia,salon);
		if(this.tengoLugarParaReservar(mesas,reserva, salon)){
			ReservaDTO rDTO=HibernateReservaDAO.getInstancia().grabarReserva(reserva, salon);
			//sucursalModel.getSalon().addReserva(AdministradorReserva.getInstancia().fromDTOTOModel(reserva));
			//AdministradorSucursal.getInstancia().updateSucursal(sucursalModel);
			return rDTO;
		}else
			throw new Exception("no hay lugar para reservar");
		
		//List<Sector>sectores=HibernateSectorDAO.getInstancia().getSectores(idSalon);
		
		
	}

	private boolean tengoLugarParaReservar(List<Mesa> mesas, ReservaDTO reserva, SalonDTO salon) {
		List<Sector>sectores=HibernateSectorDAO.getInstancia().getSectores(salon.getId());
		List<Mesa>aux=new ArrayList<Mesa>();
		
		int cantidad=reserva.getCantidad();
		for(Sector s:sectores){
			if(cantidad<=0)
				return true;
			List<Mesa>mesasSector=s.getMesas();//obtengo las mesas del sector
			cantidad=reserva.getCantidad();
			aux=new ArrayList<Mesa>();
			for(Mesa m:mesasSector){
				
				if(!mesas.contains(m)){
					
					cantidad=cantidad-m.getCapacidad();
					aux.add(m);
					if(cantidad<=0){
						for(Mesa me:aux)//paso las mesas
							mesas.add(me);
						aux=new ArrayList<Mesa>();//inicializo
						return true;
					}
				}else{
					aux=new ArrayList<Mesa>();
				}
			}
		}
		return false;
		
		
	}

	private List<Mesa> getMesasMenosReservas(List<Reserva> reservasDelDia,SalonDTO salon) {
		List<Mesa>mesas=new ArrayList<Mesa>();
		List<Mesa>aux=new ArrayList<Mesa>();
		List<Sector>sectores=HibernateSectorDAO.getInstancia().getSectores(salon.getId());
		for(Reserva r:reservasDelDia){
			int cantidad=r.getCantidad();
			for(Sector s:sectores){
				if(cantidad<=0)
					break;
				List<Mesa>mesasSector=s.getMesas();//obtengo las mesas del sector
				cantidad=r.getCantidad();
				aux=new ArrayList<Mesa>();
				for(Mesa m:mesasSector){ //recorro mesas del sector
					
					if(!mesas.contains(m)){
						
						cantidad=cantidad-m.getCapacidad();
						aux.add(m);
						if(cantidad<=0){
							for(Mesa me:aux)//paso las mesas
								mesas.add(me);
							aux=new ArrayList<Mesa>();//inicializo
							
							break;
						}
					}else{
						aux=new ArrayList<Mesa>();
					}
				}
			}
		}
		
				
		return mesas;
	}

	public List<ReservaBean> fromModelTOBean(List<Reserva> reservas) {
		List<ReservaBean> reservasBean= new ArrayList<ReservaBean>();
		for (Reserva reserva : reservas) {
			ReservaBean reservaBean=fromModelTOBean(reserva);
			reservasBean.add(reservaBean);			
		}
		return reservasBean;
	}
	
	public ReservaBean fromModelTOBean(Reserva reserva) {
		ReservaBean reservaBean=null;
		if(reserva!=null){
		reservaBean=new ReservaBean();
		reservaBean.setIdReserva(reserva.getId());
		reservaBean.setCantidad(reserva.getCantidad());
		reservaBean.setEstado(reserva.getEstado());
		reservaBean.setFechaReserva(reserva.getFechaReserva());
		reservaBean.setHora(reserva.getHora());
		}
		return reservaBean;
	}
	


	public List<Reserva> getReservasDeAhora() {
		return HibernateReservaDAO.getInstancia().getReservasDeAhora();
	}


	public List<Reserva> fromDTOTOModel(List<ReservaDTO> reservasDTO) {
		List<Reserva> reservas= new ArrayList<Reserva>();
		for (ReservaDTO reservaDTO : reservasDTO) {
			Reserva reserva=fromDTOTOModel(reservaDTO);
			reservas.add(reserva);			
		}
		return reservas;
	}
	
	public Reserva fromDTOTOModel(ReservaDTO reservaDTO) {
		Reserva reserva=null;
		if(reservaDTO!=null){
		reserva=new Reserva();
		reserva.setId(reservaDTO.getIdReserva());
		reserva.setCantidad(reservaDTO.getCantidad());
		reserva.setEstado(reservaDTO.getEstado());
		reserva.setFechaReserva(reservaDTO.getFecha());
		reserva.setHora(reservaDTO.getHora());
		}
		return reserva;
	}

	
	public List<ReservaDTO> fromModelTODTO(List<Reserva> reservas) {
		List<ReservaDTO> reservasDTO= new ArrayList<ReservaDTO>();
		for (Reserva reserva : reservas) {
			ReservaDTO reservaDTO=fromModelTODTO(reserva);
			reservasDTO.add(reservaDTO);			
		}
		return reservasDTO;
	}
	
	public ReservaDTO fromModelTODTO(Reserva reserva) {
		ReservaDTO reservaDTO=null;
		if(reserva!=null){
			reservaDTO=new ReservaDTO();
			reservaDTO.setIdReserva(reserva.getId());
			reservaDTO.setCantidad(reserva.getCantidad());
			reservaDTO.setEstado(reserva.getEstado());
			reservaDTO.setFecha(reserva.getFechaReserva());
			reservaDTO.setHora(reserva.getHora());
		}
		return reservaDTO;
	}
	
	public List<Reserva> fromBeanTOModel(List<ReservaBean> reservasBean) {
		List<Reserva> reservas= new ArrayList<Reserva>();
		for (ReservaBean reservaBean : reservasBean) {
			Reserva reserva=fromBeanTOModel(reservaBean);
			reservas.add(reserva);			
		}
		return reservas;
	}

	public Reserva fromBeanTOModel(ReservaBean reservaBean) {
		Reserva reserva=null;
		if(reservaBean!=null){
		reserva=new Reserva();
		reserva.setId(reservaBean.getIdReserva());
		reserva.setCantidad(reservaBean.getCantidad());
		reserva.setEstado(reservaBean.getEstado());
		reserva.setFechaReserva(reservaBean.getFechaReserva());
		reserva.setHora(reservaBean.getHora());
		}
		return reserva;
	}

	public Reserva getReserva(ReservaDTO r) {
				
		ReservaBean rb=HibernateReservaDAO.getInstancia().getReserva(r);
		Reserva reserva=this.fromBeanTOModel(rb);
		return reserva;
	}

	public void tomarReserva(ReservaDTO r) {
		Reserva reserva=this.getReserva(r);
		reserva.setEstado("tomada");
		HibernateReservaDAO.getInstancia().updateReserva(this.fromModelTOBean(reserva));
		
	}

}
